/* 
 * File:   main.c
 * Author: atila
 *
 * Created on 23 de Novembro de 2010, 19:59
 */

#include <stdio.h>
#include <stdlib.h>

#include "src/aluno/aluno_bo.h"
#include "src/curso/curso.h"
#include "src/curso/curso_bo.h"
#include "src/common/messages.h"
#include "src/disciplina/disciplina.h"
#include "src/admin/admin.h"

/**
 * Função de teste de componentes.\n
 * Serve para não bagunçar o main().
 */
void test_component();

void main_menu();
void aluno_menu();

void admin_view();
void aluno_view();
void curso_view();
void disciplina_view();

/*
 * 
 */
int main(int argc, char** argv) {

    main_menu();
    return (EXIT_SUCCESS);
}

void test_component() {


    read_all_curso();
    aluno_menu();
    if (handle_create_aluno() == PROC_SUCCESS) {
        printf("Deu certo.\n\n");
    } else {
        printf("Deu errado.\n\n");
    }
    /*
        if (handle_find_aluno() == PROC_SUCCESS) {
            printf("Deu certo.\n\n");
        } else {
            printf("Deu errado.\n\n");
        }
     */

    /*
        if (read_all_curso() == PROC_SUCCESS) {
            printf("Deu certo.\n\n");
        } else {
            printf("Deu errado.\n\n");
        }
     */
}

void main_menu() {

    FILE *fadmin = fopen(ADMIN_DB, "rb+");
    if (fadmin == NULL) {
        fadmin = fopen(ADMIN_DB, "wb+");
        if (fadmin == NULL) {
            printf(OPEN_FILE_ERROR, "admin");
            exit(PROC_FAILURE);
        }
    }


    puts("Rackademico - version 1.0");
    init_admin(fadmin);

    while (validation_admin(fadmin) != PROC_SUCCESS);
    fclose(fadmin);
    short int op = NOT_FOUND;
    do {
        printf("0 - Sair\n");
        printf("1 - Menu Admin\n");
        printf("2 - Menu Aluno\n");
        printf("3 - Menu Curso\n");
        printf("4 - Menu Disciplina\n");
        printf(DEFAULT_BASH);
        __fpurge(stdin);
        scanf("%1hd", &op);
        switch (op) {
            case 0:
                // sair.
                break;
            case 1:
                admin_view();
                break;
            case 2:
                aluno_view();
                break;
            case 3:
                curso_view();
                break;
            case 4:
                disciplina_view();
                break;
            default:
                puts("Opção Inválida.");
                break;
        }
    } while (op != 0);
}

void aluno_menu() {
    puts("~ Modulo Aluno ~");
    puts("0. Sair");
    puts("1. Cadastrar Aluno");
    puts("2. Buscar Aluno");
    puts("3. Inserir Notas do Aluno");
    puts("4. Listar Notas do Aluno");
    puts("5. Listar todos\n");
}

void curso_menu() {
    puts("~ Modulo Curso ~");
    puts("0. Sair");
    puts("1. Cadastrar Curso");
    puts("2. Listar todos\n");
}

void disciplina_menu() {
    printf("--Módulo Disciplina--\n");
    printf("0 - Sair\n");
    printf("1 - Criar Disciplina\n");
    printf("2 - Listar Disciplina por curso\n");
    printf("3 - Listar Disciplina por semestre\n");
    printf("4 - Listar Disciplina por ID\n");
    printf("5 - Alterar dados da disciplina\n");
}

void admin_menu() {
    printf("--Módulo Administrador--\n");
    printf("0 - Sair\n");
    printf("1 - Adicionar Administrador\n");
    printf("2 - Alterar Senha\n");
}

void aluno_view() {

    short int op = NOT_FOUND;
    do {
        aluno_menu();
        printf(DEFAULT_BASH);
        __fpurge(stdin);
        scanf("%1hd", &op);
        switch (op) {
            case 0:
                // sair.
                break;
            case 1:
                handle_create_aluno();
                break;
            case 2:
                handle_find_aluno();
                break;
            case 3:
                handle_insert_notes();
                break;
            case 4:
                /* ler todas as notas */
                handle_read_all_notes();
                break;
            case 5:
                read_all_aluno();
                break;
            default:
                puts("Opção Inválida.");
                break;
        }
    } while (op != 0);
}

void disciplina_view() {
    FILE *fdisciplina = fopen(DISCIPLINA_DB, "rb+");
    if (fdisciplina == NULL) {
        fdisciplina = fopen(DISCIPLINA_DB, "wb+");
        if (fdisciplina == NULL) {
            printf("Erro ao abrir o arquivo!!! \n");
            exit(1);
        }
    }

    short int op;
    do {
        disciplina_menu();
        printf(DEFAULT_BASH);
        __fpurge(stdin);
        scanf("%1hd", &op);
        switch (op) {
            case 0:
                break;
            case 1:
                create_disciplina(fdisciplina);
                break;
            case 2:
                list_by_curso(fdisciplina);
                break;
            case 3:
                list_by_semestre(fdisciplina);
                break;
            case 4:
                list_by_id(fdisciplina);
                break;
            case 5:
                update_disciplina(fdisciplina);
                break;
            default:
                printf("Opção Inválida\n");
                break;
        }
    } while (op != 0);
    fclose(fdisciplina);
}

void admin_view() {

    short int op = NOT_FOUND;

    FILE *fadmin = fopen(ADMIN_DB, "rb+");
    if (fadmin == NULL) {
        fadmin = fopen(ADMIN_DB, "wb+");
        if (fadmin == NULL) {
            printf(OPEN_FILE_ERROR, "admin");
            exit(PROC_FAILURE);
        }
    }

    do {
        admin_menu();
        printf(DEFAULT_BASH);
        __fpurge(stdin);
        scanf("%1hd", &op);
        switch (op) {
            case 0:
                // sair.
                break;
            case 1:
                create_admin(fadmin);
                break;
            case 2:
                update_admin(fadmin);
                break;
            default:
                puts("Opção Inválida.");
                break;
        }
    } while (op != 0);
    fclose(fadmin);
}

void curso_view() {

    short int op = NOT_FOUND;
    do {
        curso_menu();
        printf(DEFAULT_BASH);
        __fpurge(stdin);
        scanf("%1hd", &op);
        switch (op) {
            case 0:
                // sair.
                break;
            case 1:
                handle_create_curso();
                break;
            case 2:
                list_curso_by_nivel();
                break;
            default:
                puts("Opção Inválida.");
                break;
        }
    } while (op != 0);
}